<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <my-parent></my-parent>
  </div>
</body>
<template id="parent">
  <div>
    <h1>父组件</h1>
    <!-- 1. -->
    <my-child str="哈哈" :num="100" :flag="true" :msg="msg" :obj="{ val: 1000 }" :arr="['a', 'b', 'c']"></my-child>
    <my-child :num="100" :flag="true" :obj="{ val: 1000 }" ></my-child>
  </div>
</template>
<template id="child">
  <div>
    <h4>子组件</h4>
    <ul>
      <li>{{ str }}</li>
      <li>{{ num }}</li>
      <li>{{ flag }}</li>
      <li>{{ msg }}</li>
      <li>{{ obj }}</li>
      <li>{{ arr }}</li>
    </ul>
  </div>
</template>
<script src="lib/vue.js"></script>
<script>
  /**
    1.父组件在调用子组件的地方，添加自定义的属性, 属性的值就是传递给子组件的值
      如果属性的值是变量，boolean,number类型，对象，数组，null，undefined，
      需要使用绑定属性
  */

  // 2.在子组件定义的地方，添加一个props选项，有三种写法
  // 2.1 props 的值为数组，数组的元素为 之前定义的属性名
  // 2.2 props 的值为对象，key值为自定义的属性名，value值为数据类型
  // 2.3 props 的值为对象，key值为自定义的属性名，value值又为一个对象
  //    该对象的 type 属性可以表示 数据类型
  //    该对象的 default 属性可以表示 属性的默认值（父组件在调用子组件时可以不传递）--- 如果属性值是对象或者数组，default写为函数，返回相应的值
  //    该对象的 required 属性表示该属性是必须传递的，即使 使用了 default 也要传递数据
  //    该对象的 validator 属性可以实现自定义验证函数, 如果返回值为false，会弹出警告

  // 在子组件的模版中可以通过 自定义的属性名 渲染数据
  const Child = {
    // props: ['str', 'num', 'flag', 'msg', 'obj', 'arr'],
    // props: {
    //   str: String,
    //   num: Number, // 更改为 String 查看控制台信息 --- 警告信息
    //   flag: Boolean,
    //   msg: String,
    //   obj: Object,
    //   arr: Array
    // },
    props: {
      str: {
        type: String,
        default: '曦曦'
      },
      num: {
        type: Number,
        validator (val) {
          return val > 1000
        }
      }, 
      flag: Boolean,
      msg: {
        type: String,
        required: true,
        default: '嘎嘎'
      },
      obj: Object,
      arr: {
        type: Array,
        default () {
          return ['1', '2', '3']
        }
      }
    },
    template: '#child'
  }
  const Parent = {
    template: '#parent',
    data () {
      return {
        msg: 'hello val'
      }
    },
    components: {
      MyChild: Child
    }
  }

  new Vue({
    el: '#app',
    components: {
      MyParent: Parent
    }
  })
</script>
</html>